package com.estagio.bean;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import org.primefaces.context.RequestContext;

import com.estagio.entity.Aluno;
import com.estagio.entity.CondicaoPagamento;
import com.estagio.entity.ContaReceber;
import com.estagio.entity.FormaPagamento;
import com.estagio.entity.ItemVenda;
import com.estagio.entity.Produto;
import com.estagio.entity.Venda;
import com.estagio.session.AlunoSession;
import com.estagio.session.CondicaoPagamentoSession;
import com.estagio.session.ContaReceberSession;
import com.estagio.session.ItemVendaSession;
import com.estagio.session.ProdutoSession;
import com.estagio.session.VendaSession;

@ManagedBean(name="vendaBean")
@SessionScoped
public class VendaBean {
	
	//VENDA
	private Venda venda = new Venda();
	private Venda vendaSave = new Venda();
	private DataModel dmVenda;
	private Double somaValorTotal;
	
	//PRODUTO
	private Produto produto = new Produto();
	private DataModel dmProduto;	
	
	//ITEMVENDA
	private ItemVenda itemVenda = new ItemVenda();
	private DataModel dmItemVenda;
	private ItemVenda itemVendaSelect = new ItemVenda();
	private List<ItemVenda> arrayItemVenda;
	
	//CONDICAO DE PAGAMENTO
	private CondicaoPagamento condicaoPagamento = new CondicaoPagamento();
	private DataModel dmCondicaoPagamento;
	private List<CondicaoPagamento> arrayCondicaoPagamento;
	
	//ALUNO
	private Aluno aluno = new Aluno();
	private DataModel dmAluno;

	//CONTAS A RECEBER
	private List<ContaReceber> listContaReceber;

	//GETTERS AND SETTERS	
	
	public Venda getVenda() {
		return venda;
	}

	public ItemVenda getItemVendaSelect() {
		return itemVendaSelect;
	}

	public void setItemVendaSelect(ItemVenda itemVendaSelect) {
		this.itemVendaSelect = itemVendaSelect;
	}

	public Aluno getAluno() {
		return aluno;
	}

	public void setAluno(Aluno aluno) {
		this.aluno = aluno;
	}

	public DataModel getDmAluno() {
		return dmAluno;
	}

	public void setDmAluno(DataModel dmAluno) {
		this.dmAluno = dmAluno;
	}

	public void setVenda(Venda venda) {
		this.venda = venda;
	}

	public Venda getVendaSave() {
		return vendaSave;
	}

	public void setVendaSave(Venda vendaSave) {
		this.vendaSave = vendaSave;
	}

	public DataModel getDmVenda() {
		return dmVenda;
	}

	public void setDmVenda(DataModel dmVenda) {
		this.dmVenda = dmVenda;
	}

	public Double getSomaValorTotal() {
		return somaValorTotal;
	}

	public void setSomaValorTotal(Double somaValorTotal) {
		this.somaValorTotal = somaValorTotal;
	}

	public Produto getProduto() {
		return produto;
	}

	public void setProduto(Produto produto) {
		this.produto = produto;
	}

	public DataModel getDmProduto() {
		return dmProduto;
	}

	public void setDmProduto(DataModel dmProduto) {
		this.dmProduto = dmProduto;
	}

	public ItemVenda getItemVenda() {
		return itemVenda;
	}

	public void setItemVenda(ItemVenda itemVenda) {
		this.itemVenda = itemVenda;
	}

	public DataModel getDmItemVenda() {
		return dmItemVenda;
	}

	public void setDmItemVenda(DataModel dmItemVenda) {
		this.dmItemVenda = dmItemVenda;
	}
	
	public List<ItemVenda> getArrayItemVenda() {
		return arrayItemVenda;
	}

	public void setArrayItemVenda(List<ItemVenda> arrayItemVenda) {
		this.arrayItemVenda = arrayItemVenda;
	}

	public CondicaoPagamento getCondicaoPagamento() {
		return condicaoPagamento;
	}

	public void setCondicaoPagamento(CondicaoPagamento condicaoPagamento) {
		this.condicaoPagamento = condicaoPagamento;
	}

	public DataModel getDmCondicaoPagamento() {
		return dmCondicaoPagamento;
	}

	public void setDmCondicaoPagamento(DataModel dmCondicaoPagamento) {
		this.dmCondicaoPagamento = dmCondicaoPagamento;
	}

	public List<CondicaoPagamento> getArrayCondicaoPagamento() {
		return arrayCondicaoPagamento;
	}

	public void setArrayCondicaoPagamento(
			List<CondicaoPagamento> arrayCondicaoPagamento) {
		this.arrayCondicaoPagamento = arrayCondicaoPagamento;
	}

	public List<ContaReceber> getListContaReceber() {
		return listContaReceber;
	}

	public void setListContaReceber(List<ContaReceber> listContaReceber) {
		this.listContaReceber = listContaReceber;
	}
	
	//VENDA



	public void saveVenda() {
		VendaSession session = new VendaSession();
		String mensagem = session.save(this.venda, this.arrayItemVenda, this.listContaReceber);
		FacesMessage faces = new FacesMessage(mensagem);
		FacesContext contexto = FacesContext.getCurrentInstance();
		contexto.addMessage(null, faces);		
		RequestContext.getCurrentInstance().update("panelManterVenda");
		RequestContext.getCurrentInstance().update("growl");

	}

	public String deleteVenda() {
		VendaSession vendaRN = new VendaSession();		
		Venda venda = this.vendaSave;
		String mensagem = vendaRN.delete(venda);
		this.vendaSave = new Venda();
		FacesMessage faces = new FacesMessage(mensagem);
		FacesContext contexto = FacesContext.getCurrentInstance();
		contexto.addMessage(null, faces);
		return "consultarVenda";
	}

	public DataModel findVenda() {
		VendaSession vendaSession = new VendaSession();
		this.venda = new Venda();
		List<Venda> lista = vendaSession.find(this.venda, null);
//		System.out.println("array no find vendaBean: " + lista.size());
		this.dmVenda = new ListDataModel(lista);
		return this.dmVenda;
	}
	
	public void clean() {
		this.venda = new Venda();
	}
	
	//ALUNO
		public DataModel findAluno() {
			AlunoSession session = new AlunoSession();
			List<Aluno> lista = session.find(this.aluno);
			this.dmAluno = new ListDataModel(lista);
			return this.dmAluno;
		}
		
		public void selectAluno() {
			this.venda.setAluno((Aluno) this.dmAluno.getRowData());
			RequestContext.getCurrentInstance().update("pgAluno");
			RequestContext.getCurrentInstance().execute("dialogConsultarAluno.hide()");
		}
	

	//PRODUTO
//	public void saveProduto() {
//		ProdutoSession produtoSession = new ProdutoSession();
//		Produto produto = this.produto;		
//		this.mensagem = produtoSession.save(produto);
//		
//		FacesMessage faces = new FacesMessage(this.mensagem);
//		FacesContext contexto = FacesContext.getCurrentInstance();
//		contexto.addMessage(null, faces);		
//	}
//
//	public String deleteProduto() {
//		ProdutoSession produtoRN = new ProdutoSession();		
//		Produto produto = this.produtoSelecionado;
//		this.mensagem = produtoRN.delete(produto);
//		this.produtoSelecionado = new Produto();
//		FacesMessage faces = new FacesMessage(mensagem);
//		FacesContext contexto = FacesContext.getCurrentInstance();
//		contexto.addMessage(null, faces);
//		return "consultarProduto";
//	}

	public DataModel findProduto() {
		RequestContext.getCurrentInstance().update("panelDialogConsultarProduto");		
		
		List<Produto> listaProduto = new ProdutoSession().find(this.produto);
		this.dmProduto = new ListDataModel(listaProduto);
		return this.dmProduto;
	}

	public void selectProduto() {
		Produto produto = (Produto) this.dmProduto.getRowData();
		this.itemVenda.setProduto(produto);
		RequestContext.getCurrentInstance().update("pgItemVenda");
		RequestContext.getCurrentInstance().execute("dialogConsultarProduto.hide()");		
	}	
	
	public void addItemVenda() {		
		ItemVendaSession session = new ItemVendaSession();
		String valida = session.valida(this.arrayItemVenda, this.itemVenda);
		
		if((valida.equals(""))) {
			this.itemVenda.setPrecoTotal(this.itemVenda.getProduto().getValor() * this.itemVenda.getQuantidade());
			this.somaValorTotal = this.somaValorTotal + this.itemVenda.getPrecoTotal();
			this.arrayItemVenda.add(this.itemVenda);
			RequestContext.getCurrentInstance().update("pgProduto");
			RequestContext.getCurrentInstance().update("tableItemVenda");
			RequestContext.getCurrentInstance().execute("dialogConsultarProduto.hide()");
		} else {
			FacesMessage faces = new FacesMessage(valida);
			FacesContext contexto = FacesContext.getCurrentInstance();
			contexto.addMessage(null, faces);
			RequestContext.getCurrentInstance().update("growl");
		}
		this.venda.setValorTotal(this.somaValorTotal);
		this.itemVenda = new ItemVenda();
		this.itemVenda.setProduto(new Produto());
		RequestContext.getCurrentInstance().update("pgItemVenda");
		RequestContext.getCurrentInstance().update("pgCondicaoPagamento");

	}
	
	public Boolean disableCalculaTotalVenda() {
		if(this.venda.getCondicaoPagamento().getIdCondicaoPagamento() != null) {
			return false;
		} else {
			return true;
		}
	}
	
	public void calculaTotalVenda() {
		System.out.println("entrou");
		VendaSession session = new VendaSession();
		this.venda = session.calculaTotal(this.venda, this.somaValorTotal);
		ContaReceberSession sessionCR = new ContaReceberSession();
		ContaReceber cr = new ContaReceber();
		cr.setVenda(this.venda);
		this.listContaReceber = sessionCR.validaContaReceber(cr);
		
		RequestContext.getCurrentInstance().update("pgTotal");
		RequestContext.getCurrentInstance().update("tableParcela");
	}
	
		
	//CONDICAO DE PAGAMENTO
	public DataModel findCondicaoPagamento() {
		List<CondicaoPagamento> listaCondicaoPagamento = new CondicaoPagamentoSession().find(this.condicaoPagamento);
		this.dmCondicaoPagamento = new ListDataModel(listaCondicaoPagamento);
		return this.dmCondicaoPagamento;
	}

	public void selectCondicaoPagamento() {
		CondicaoPagamento condicaoPagamento = (CondicaoPagamento) this.dmCondicaoPagamento.getRowData();
		this.venda.setCondicaoPagamento(condicaoPagamento);
		RequestContext.getCurrentInstance().update("pgCondicaoPagamento");
		RequestContext.getCurrentInstance().update("pgTotal");
		RequestContext.getCurrentInstance().execute("dialogConsultarCondicaoPagamento.hide()");
	}
	
	public Boolean disableCondicao() {
		if((this.somaValorTotal != null) && (this.somaValorTotal != 0)) {
			return false;
		} else {
			return true;
		}
	}

	
	//INVOCAR TELAS
	public String newVenda() {
		this.venda = new Venda();
		this.venda.setAluno(new Aluno());
		this.venda.setCondicaoPagamento(new CondicaoPagamento());
		this.venda.getCondicaoPagamento().setFormaPagamento(new FormaPagamento());
		this.venda.setDtVenda(new Date());
		this.arrayCondicaoPagamento = new ArrayList<CondicaoPagamento>();
		this.condicaoPagamento = new CondicaoPagamento();
		this.somaValorTotal = 0.00;
		this.arrayItemVenda = new ArrayList<ItemVenda>();
		this.itemVenda = new ItemVenda();
		this.itemVenda.setProduto(new Produto());
		this.listContaReceber = new ArrayList<ContaReceber>();
		return "manterVenda";
	}

	public String consultarVenda() {
		return "consultarVenda";
	}

	public String editarVenda() {
		this.vendaSave = (Venda) this.dmVenda.getRowData();		
		return "editarVenda";
	}
	
	public String excluirVenda() {
		this.vendaSave = (Venda) this.dmVenda.getRowData();
		return "excluirVenda";
	}
	
	//DIALOGS
	public void openDialogConsultarCondicaoPagamento() {
		RequestContext.getCurrentInstance().update("idDialogConsultarCondicaoPagamento");
		RequestContext.getCurrentInstance().execute("dialogConsultarCondicaoPagamento.show()");
	}

	public void openDialogConsultarProduto() {
		RequestContext.getCurrentInstance().update("idDialogConsultarProduto");
		RequestContext.getCurrentInstance().execute("dialogConsultarProduto.show()");
	}
	
	public void openDialogConsultarAluno() {
		this.aluno = new Aluno();
		RequestContext.getCurrentInstance().update("idDialogConsultarAluno");
		RequestContext.getCurrentInstance().execute("dialogConsultarAluno.show()");
	}
}
